#ifndef SERVER_CLIENTMANAGER_H_
#define SERVER_CLIENTMANAGER_H_

#include <list>
#include "Socket.h"
#include "Thread.h"
#include "Mutex.h"
#include "../Modelo/Circuito.h"
#include "../XML/ParserXml.h"
#include "../SOAP/empaquetadorSoap.h"
#include "../SOAP/DesempaquetadorSoap.h"

class ClientManager :public Thread {
private:
	Socket* socket;
	bool busy;
	Mutex& mutex_lista;
	std::list<Circuito*>* lista_circuitos;

public:
	ClientManager(Socket* sock, std::list<Circuito*>* lista, Mutex& mutex_lista);
	virtual ~ClientManager(){};
//----------metodos para intercambio de informacion---------//

	int enviar_circuito(std::string circuito);
	int enviar_data(Circuito* circuito_actual);
	int enviar_simulacion(Circuito* circuito_actual,std::string stream);

	int parsear_msj_soap(std::string stream, std::string& circuito,
											std::string& orden, std::string& entradas);
//-------Metodos para la Comunicacion--------//	
	int Recive(std::string& stream);
	int Send(char* msj);
	int Shutdown(int how);
	int Close();

//----------Metodos Funcionales----------//
	/*run: lanza la rutina que corre el ClienteManager*/
	void* run();

	/*Modifica el estado busy segun el parametro*/
	void Busy(bool busy){this->busy=busy;};

	/*Devuelve true si el hilo en cuestion aun esta conectado a un cliente*/
	bool isBusy(){return busy;};

	/*ValidarCliente: Toma el string de presentacion del cliente (SOY X) y
		valida que sea un cliente valido (la sintaxis es correcta, y el nro de 
		cliente tambien)*/
	int ValidarCliente(std::string stream,int& cliente);

	/*SendError: Envia el mensaje ERROR al Socket y cierra
	*	la conexion con el mismo.*/
	int SendError();

	/*ParsearMsj: Busca el espacio en blanco primero y luego el \n.
	*post:devuelve -1 si no habia un espacio en blanco y cero si habia.
	*	devuelve por referencia ambas partes como resultado del parseo*/
	int ParsearMsj(std::string stream, std::string& circuito, std::string& orden);
};

#endif /* SERVER_CLIENTMANAGER_H_ */
